#ifndef HNET_SOCKET_H
#define HNET_SOCKET_H

#pragma once

#include <memory>

class Socket
    : public std::enable_shared_from_this<Socket>
{
public:
    using Ptr = std::shared_ptr<Socket>;

    Socket() = default;
    ~Socket() = default;
};

template<typename Protocol>
class basic_socket
{

};

template<typename Protocol>
class basic_stream_socket
    : public basic_socket<Protocol>
{

};

template<typename Protocol>
class basic_endpoint
{

};

template<typename Protocol>
class basic_socket_acceptor
{

};

template<typename Protocol>
class basic_datagram_socket
    : public basic_socket<Protocol>
{

};

template<typename Protocol>
class basic_resolver
{

};

namespace ip {
class tcp
{
    using socket = basic_stream_socket<tcp>;
    using endpoint = basic_endpoint<tcp>;
    using acceptor = basic_socket_acceptor<tcp>;
};

class udp
{
    using socket = basic_datagram_socket<udp>;
    using resolver = basic_resolver<udp>;
};
}

#endif // HNET_SOCKET_H